@@ -0,0 +1,59 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+# Generated by Django 1.11.29 on 2020-05-31 18:37 |
|
| 3 |
+from __future__ import unicode_literals |
|
| 4 |
+ |
|
| 5 |
+from django.db import migrations, models |
|
| 6 |
+ |
|
| 7 |
+ |
|
| 8 |
+class Migration(migrations.Migration): |
|
| 9 |
+ |
|
| 10 |
+ dependencies = [ |
|
| 11 |
+ ('account', '0045_userinfo_new_subscribe'),
|
|
| 12 |
+ ] |
|
| 13 |
+ |
|
| 14 |
+ operations = [ |
|
| 15 |
+ migrations.AddField( |
|
| 16 |
+ model_name='userinfo', |
|
| 17 |
+ name='is_maintenance', |
|
| 18 |
+ field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u7ef4\u4fee\u5458', verbose_name='is_maintenance'), |
|
| 19 |
+ ), |
|
| 20 |
+ migrations.AddField( |
|
| 21 |
+ model_name='userinfo', |
|
| 22 |
+ name='userid', |
|
| 23 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u4f01\u4e1a\u5fae\u4fe1 userid', max_length=32, null=True, verbose_name='userid'), |
|
| 24 |
+ ), |
|
| 25 |
+ migrations.AlterField( |
|
| 26 |
+ model_name='userinfo', |
|
| 27 |
+ name='openid', |
|
| 28 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid'), |
|
| 29 |
+ ), |
|
| 30 |
+ migrations.AlterField( |
|
| 31 |
+ model_name='userinfo', |
|
| 32 |
+ name='openid_lensman', |
|
| 33 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_lensman'), |
|
| 34 |
+ ), |
|
| 35 |
+ migrations.AlterField( |
|
| 36 |
+ model_name='userinfo', |
|
| 37 |
+ name='openid_miniapp', |
|
| 38 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_miniapp'), |
|
| 39 |
+ ), |
|
| 40 |
+ migrations.AlterField( |
|
| 41 |
+ model_name='userinfo', |
|
| 42 |
+ name='openid_oauth', |
|
| 43 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_oauth'), |
|
| 44 |
+ ), |
|
| 45 |
+ migrations.AlterField( |
|
| 46 |
+ model_name='userinfo', |
|
| 47 |
+ name='openid_tourguide', |
|
| 48 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5fae\u4fe1 Openid', max_length=32, null=True, unique=True, verbose_name='openid_tourguide'), |
|
| 49 |
+ ), |
|
| 50 |
+ migrations.AlterField( |
|
| 51 |
+ model_name='userinfo', |
|
| 52 |
+ name='user_from', |
|
| 53 |
+ field=models.IntegerField(choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (22, '\u4f01\u4e1a\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')], default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from'), |
|
| 54 |
+ ), |
|
| 55 |
+ migrations.AlterUniqueTogether( |
|
| 56 |
+ name='userinfo', |
|
| 57 |
+ unique_together=set([('appid', 'userid')]),
|
|
| 58 |
+ ), |
|
| 59 |
+ ] |
@@ -256,6 +256,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 256 | 256 |
LENSMAN_USER = 10 |
| 257 | 257 |
TOURGUIDE_USER = 11 |
| 258 | 258 |
MINIAPP_USER = 12 |
| 259 |
+ QYMINIAPP_USER = 22 |
|
| 259 | 260 |
OAUTH_USER = 13 |
| 260 | 261 |
|
| 261 | 262 |
USER_FROM = ( |
@@ -266,6 +267,7 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 266 | 267 |
(LENSMAN_USER, u'摄影师端用户'), |
| 267 | 268 |
(TOURGUIDE_USER, u'导游端用户'), |
| 268 | 269 |
(MINIAPP_USER, u'小程序端用户'), |
| 270 |
+ (QYMINIAPP_USER, u'企业微信小程序端用户'), |
|
| 269 | 271 |
(OAUTH_USER, u'网页授权用户'), |
| 270 | 272 |
) |
| 271 | 273 |
|
@@ -317,11 +319,13 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 317 | 319 |
# 微信授权用户 |
| 318 | 320 |
appid = models.CharField(_(u'appid'), max_length=32, blank=True, null=True, help_text=u'appId', db_index=True) |
| 319 | 321 |
unionid = models.CharField(_(u'unionid'), max_length=32, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True) |
| 320 |
- openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True) |
|
| 321 |
- openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True) |
|
| 322 |
- openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True) |
|
| 323 |
- openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True) |
|
| 324 |
- openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True) |
|
| 322 |
+ openid = models.CharField(_(u'openid'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
| 323 |
+ openid_lensman = models.CharField(_(u'openid_lensman'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
| 324 |
+ openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
| 325 |
+ openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
| 326 |
+ openid_oauth = models.CharField(_(u'openid_oauth'), max_length=32, blank=True, null=True, help_text=u'微信 Openid', db_index=True, unique=True) |
|
| 327 |
+ # 企业微信授权用户 |
|
| 328 |
+ userid = models.CharField(_(u'userid'), max_length=32, blank=True, null=True, help_text=u'企业微信 userid', db_index=True) |
|
| 325 | 329 |
# 用户基本信息 |
| 326 | 330 |
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名') |
| 327 | 331 |
sex = models.IntegerField(_(u'sex'), choices=SexModelMixin.SEX_TUPLE, default=SexModelMixin.UNKNOWN, help_text=u'用户性别') |
@@ -373,10 +377,17 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 373 | 377 |
shots_num = models.IntegerField(_(u'shots_num'), default=0, help_text=u'主持镜头数') |
| 374 | 378 |
level = models.IntegerField(_(u'level'), choices=LEVEL_TUPLE, default=MEMBER_NO, help_text=u'会员等级') |
| 375 | 379 |
|
| 380 |
+ # 维修员信息 |
|
| 381 |
+ is_maintenance = models.BooleanField(_(u'is_maintenance'), default=False, help_text=_(u'是否维修员'), db_index=True) |
|
| 382 |
+ |
|
| 376 | 383 |
class Meta: |
| 377 | 384 |
verbose_name = _(u'userinfo') |
| 378 | 385 |
verbose_name_plural = _(u'userinfo') |
| 379 | 386 |
|
| 387 |
+ unique_together = ( |
|
| 388 |
+ ('appid', 'userid'),
|
|
| 389 |
+ ) |
|
| 390 |
+ |
|
| 380 | 391 |
def __unicode__(self): |
| 381 | 392 |
return unicode(self.pk) |
| 382 | 393 |
|
@@ -462,6 +473,8 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin): |
||
| 462 | 473 |
'freeze_integral': self.freeze_integral, |
| 463 | 474 |
'shots_num': self.shots_num, |
| 464 | 475 |
'level': self.level, |
| 476 |
+ # 维修员信息 |
|
| 477 |
+ 'is_maintenance': self.is_maintenance, |
|
| 465 | 478 |
} |
| 466 | 479 |
|
| 467 | 480 |
@property |
@@ -163,7 +163,6 @@ def query_usercoupons(request): |
||
| 163 | 163 |
|
| 164 | 164 |
coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-created_at')
|
| 165 | 165 |
coupons = [coupon.admindata for coupon in coupons] |
| 166 |
- print coupons |
|
| 167 | 166 |
|
| 168 | 167 |
return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
|
| 169 | 168 |
'coupons': coupons, |
@@ -13,7 +13,7 @@ from group import (groupuser_views, lensman_views, tourguidegroup_views, tourgui |
||
| 13 | 13 |
tourguidegroupuser_views) |
| 14 | 14 |
from group import views as group_views |
| 15 | 15 |
from message import views as message_views |
| 16 |
-from miniapp import views as mini_views |
|
| 16 |
+from miniapp import views as mini_views, qy_views |
|
| 17 | 17 |
from operation import views as op_views |
| 18 | 18 |
from page import oauth_views, sale_views, screen_views |
| 19 | 19 |
from pay import views as pay_views |
@@ -184,6 +184,8 @@ urlpatterns += [ |
||
| 184 | 184 |
url(r'^mini/userinfo$', mini_views.get_userinfo_api, name='get_userinfo_api'), # 获取用户信息 |
| 185 | 185 |
url(r'^mini/login$', mini_views.mini_login_api, name='mini_login_api'), # 小程序登录 |
| 186 | 186 |
url(r'^mini/userinfo2$', mini_views.get_userinfo_api2, name='get_userinfo_api2'), # 获取用户信息 |
| 187 |
+ |
|
| 188 |
+ url(r'^qy/login$', qy_views.qy_login_api, name='qy_login_api'), # 小程序登录 |
|
| 187 | 189 |
] |
| 188 | 190 |
|
| 189 | 191 |
urlpatterns += [ |
@@ -440,6 +440,9 @@ COMPONENT_CALLBACK_CONFIG = {
|
||
| 440 | 440 |
# 测试文件 |
| 441 | 441 |
TESTING_ZBAR = os.path.join(BASE_DIR, 'utils/zbar/zbar.jpg').replace('\\', '/')
|
| 442 | 442 |
|
| 443 |
+# QY |
|
| 444 |
+QY_MAINTENANCE_USERID = [] |
|
| 445 |
+ |
|
| 443 | 446 |
# 开发调试相关配置 |
| 444 | 447 |
if DEBUG: |
| 445 | 448 |
try: |
@@ -0,0 +1,70 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+import logging |
|
| 4 |
+ |
|
| 5 |
+from django.conf import settings |
|
| 6 |
+from django.db import transaction |
|
| 7 |
+from django_curtail_uuid import CurtailUUID |
|
| 8 |
+from django_logit import logit |
|
| 9 |
+from django_response import response |
|
| 10 |
+from ipaddr import client_ip |
|
| 11 |
+from pyqywe_miniapp import get_userid |
|
| 12 |
+from pywe_storage import RedisStorage |
|
| 13 |
+from TimeConvert import TimeConvert as tc |
|
| 14 |
+ |
|
| 15 |
+from account.models import UserInfo |
|
| 16 |
+from statistic.models import RegisterStatisticInfo |
|
| 17 |
+from utils.error.errno_utils import ProductBrandStatusCode |
|
| 18 |
+from utils.redis.connect import r |
|
| 19 |
+from utils.redis.rprofile import set_profile_info |
|
| 20 |
+ |
|
| 21 |
+ |
|
| 22 |
+WECHAT = settings.WECHAT |
|
| 23 |
+logger = logging.getLogger('logit')
|
|
| 24 |
+ |
|
| 25 |
+ |
|
| 26 |
+@logit(res=True) |
|
| 27 |
+@transaction.atomic |
|
| 28 |
+def qy_login_api(request): |
|
| 29 |
+ brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
|
|
| 30 |
+ appId = request.POST.get('appId', 'QYMINIAPP')
|
|
| 31 |
+ |
|
| 32 |
+ if brand_id != settings.KODO_DEFAULT_BRAND_ID: |
|
| 33 |
+ return response(ProductBrandStatusCode.BRAND_NOT_MATCH) |
|
| 34 |
+ |
|
| 35 |
+ wxcfg = WECHAT.get(appId, {})
|
|
| 36 |
+ |
|
| 37 |
+ appid = wxcfg.get('appID')
|
|
| 38 |
+ secret = wxcfg.get('appsecret')
|
|
| 39 |
+ |
|
| 40 |
+ code = request.POST.get('code', '')
|
|
| 41 |
+ |
|
| 42 |
+ userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r)) |
|
| 43 |
+ |
|
| 44 |
+ # Get or Create User |
|
| 45 |
+ user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid) |
|
| 46 |
+ |
|
| 47 |
+ # Set User_id |
|
| 48 |
+ if created: |
|
| 49 |
+ user.user_id = CurtailUUID.uuid(UserInfo, 'user_id') |
|
| 50 |
+ # 注册用户统计 |
|
| 51 |
+ rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create( |
|
| 52 |
+ brand_id=brand_id, |
|
| 53 |
+ ymd=int(tc.local_string(format='%Y%m%d')), |
|
| 54 |
+ ) |
|
| 55 |
+ rsi.num += 1 |
|
| 56 |
+ rsi.save() |
|
| 57 |
+ |
|
| 58 |
+ # Set User Key's Value |
|
| 59 |
+ user.user_from = UserInfo.QYMINIAPP_USER |
|
| 60 |
+ user.appid = appid |
|
| 61 |
+ user.user_status = UserInfo.ACTIVATED |
|
| 62 |
+ user.signup_ip = client_ip(request) |
|
| 63 |
+ user.signup_at = tc.utc_datetime() |
|
| 64 |
+ user.is_maintenance = userid in settings.QY_MAINTENANCE_USERID |
|
| 65 |
+ user.save() |
|
| 66 |
+ |
|
| 67 |
+ # Store Userinfo |
|
| 68 |
+ set_profile_info(user) |
|
| 69 |
+ |
|
| 70 |
+ return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brandata(brand_id=brand_id)) |